home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / prolog / brklyprl.lha / Emulator / get_put_unify.c < prev    next >
Encoding:
C/C++ Source or Header  |  1989-04-14  |  5.6 KB  |  312 lines

  1.  
  2. /* Copyright (C) 1988, 1989 Herve' Touati, Aquarius Project, UC Berkeley */
  3.  
  4. /* Copyright Herve' Touati, Aquarius Project, UC Berkeley */
  5.  
  6. #include <stream.h>
  7. #include "tags.h"
  8. #include "instr.h"
  9. #include "hash_table.h"
  10. #include "string_table.h"
  11. #include "memory.h"
  12. #include "basics.h"
  13.  
  14. void wrong_instruction_called()
  15. {
  16.   cerr << "wrong instruction called\n";
  17.   exit(1);
  18. }
  19.  
  20.  /* conventions: */
  21.  /* a DATA POINTER is stored as an OFFSET from H0 */
  22.  /* a STACK POINTER register is stored by casting it to UNSIGNED */
  23.  /* a CODE POINTER is stored by casting it to UNSIGNED */
  24.  
  25. inline void get_variable(Cell& Arg1, Cell Arg2) {
  26.   Arg1 = Arg2;
  27. }
  28.  
  29. void GetVariableX()
  30. {
  31.   get_variable(X[P->arg1], X[P->arg2]);
  32. }
  33. void GetVariableY()
  34. {
  35.   get_variable(E[P->arg1], X[P->arg2]);
  36. }
  37.  
  38. inline void get_value(Cell Arg1, Cell Arg2) {
  39.   if (! unify(Arg1, Arg2))
  40.     P = FP0;
  41. }
  42.  
  43. void GetValueX()
  44. {
  45.   get_value(X[P->arg1], X[P->arg2]);
  46. }
  47. void GetValueY()
  48. {
  49.   get_value(E[P->arg1], X[P->arg2]);
  50. }
  51.  
  52. inline void get_constant(Cell Arg1, Cell Arg2) {
  53.   Arg2 = deref(Arg2);
  54.   if (Arg1 != Arg2) {
  55.     if (get_tag(Arg2) == TAGREF)
  56.       Bind(Arg2, Arg1);
  57.     else
  58.       (P = FP0);
  59.   }
  60. }
  61.  
  62. void GetConstant()
  63. {
  64.   get_constant(P->arg1, X[P->arg2]);
  65. }
  66.  
  67.  /* NIL is the internalized atom "[]" */
  68.  /* this is a unique identification */
  69. void GetNil()
  70. {
  71.   get_constant(NIL, X[P->arg1]);
  72. }
  73.  
  74. void get_structure(Cell atom, Cell var, Cell arity) 
  75. {
  76.   var = deref(var);
  77.   if (get_tag(var) == TAGREF) {
  78.     MODE = MODE_WRITE;
  79.     Bind(var, make_ptr(TAGSTRUCT, H));
  80.     *H++ = atom;
  81.     *H++ = make_int(arity);
  82.   } else if (get_tag(var) == TAGSTRUCT && rvalue(var) == atom) {
  83.     MODE = MODE_READ;
  84.     S = addr(var) + 2;
  85.   } else {
  86.     P = FP0;
  87.   }
  88. }
  89.  
  90. void GetStructure() {
  91.   get_structure(P->arg1, X[P->arg2], P->arg3);
  92. }
  93.  
  94. void get_list(Cell Var) 
  95. {
  96.   Var = deref(Var);
  97.   switch (get_tag(Var)) {
  98.   case TAGREF:
  99.     MODE = MODE_WRITE;
  100.     Bind(Var, make_ptr(TAGLIST, H));
  101.     break;
  102.   case TAGLIST:
  103.     MODE = MODE_READ;
  104.     S = addr(Var);
  105.     break;
  106.   default:
  107.     P = FP0;
  108.     break;
  109.   }
  110. }
  111.  
  112. void GetList() {get_list(X[P->arg1]);}
  113.  
  114.  
  115.  
  116.  /* PUT INSTRUCTIONS */
  117.  
  118.  
  119. inline void put_variable_X(Cell& Arg1, Cell& Arg2) 
  120. {
  121.   *H = make_ptr(TAGREF, H);
  122.   Arg2 = Arg1 = *H++;
  123. }
  124.  
  125. inline void put_variable_Y(Cell& Arg1, Cell& Arg2) 
  126. {
  127.   Arg2 = Arg1 = make_cell(TAGREF, &Arg1);
  128. }
  129.  
  130. void PutVariableX() 
  131. {
  132.   put_variable_X(X[P->arg1], X[P->arg2]);
  133. }
  134. void PutVariableY() 
  135. {
  136.   put_variable_Y(E[P->arg1], X[P->arg2]);
  137. }
  138.  
  139. inline void put_value(Cell Arg1, Cell& Arg2) 
  140. {
  141.   Arg2 = Arg1;
  142. }
  143.  
  144. void PutValueX() 
  145. {
  146.   put_value(X[P->arg1], X[P->arg2]);
  147. }
  148. void PutValueY() 
  149. {
  150.   put_value(E[P->arg1], X[P->arg2]);
  151. }
  152.  
  153. inline void put_unsafe_value(Cell Arg1, Cell& Arg2) 
  154. {
  155.   Arg1 = deref(Arg1);
  156.   if (get_tag(Arg1) == TAGREF && cellp(Arg1) >= E0) {
  157.     *H = make_ptr(TAGREF, H);
  158.     Bind(Arg1, *H++);
  159.   }
  160.   Arg2 = Arg1;
  161. }
  162. void PutUnsafeValue() 
  163. {
  164.   put_unsafe_value(E[P->arg1], X[P->arg2]);
  165. }
  166.  
  167. void PutConstant() 
  168. {
  169.   put_value(P->arg1, X[P->arg2]);
  170. }
  171. void PutNil() 
  172. {
  173.   put_value(NIL, X[P->arg1]);
  174. }
  175.  
  176. inline void put_structure(Cell atom, Cell& Var, Cell arity) 
  177. {
  178.   Var = make_ptr(TAGSTRUCT, H);
  179.   *H++ = atom;
  180.   *H++ = make_int(arity);
  181. }  
  182.  
  183. void PutStructure() 
  184. {
  185.   put_structure(P->arg1, X[P->arg2], P->arg3);
  186. }
  187.  
  188. inline void put_list(Cell& Arg1) 
  189. {
  190.   Arg1 = make_ptr(TAGLIST, H);
  191. }
  192.  
  193. void PutList() 
  194. {
  195.   put_list(X[P->arg1]);
  196. }
  197.  
  198.  
  199.  
  200.  /* UNIFY INSTRUCTIONS */
  201.  
  202.  
  203. inline void unify_void_write() 
  204. {
  205.   *H = make_ptr(TAGREF, H); H++;
  206. }
  207.  
  208. inline void unify_void() 
  209. {
  210.   if (MODE == MODE_READ) {
  211.     S++;
  212.   } else {
  213.     unify_void_write();
  214.   }
  215. }
  216.  
  217. void UnifyVoid() {unify_void();}
  218. void UnifyVoidWrite() {unify_void_write();}
  219.  
  220. inline void unify_value_write(Cell Arg1) 
  221. {
  222.   Arg1 = deref(Arg1);
  223.   if (get_tag(Arg1) == TAGREF && cellp(Arg1) >= E0) {
  224.     *H = make_ptr(TAGREF, H);
  225.     Bind(Arg1, *H++);
  226.   } else {
  227.     *H++ = Arg1;
  228.   }
  229. }
  230.  
  231. inline void unify_value(Cell Arg1) 
  232. {
  233.   if (MODE == MODE_READ) {
  234.     if (! unify(Arg1, *S++)) {
  235.       P = FP0;
  236.     }
  237.   } else {
  238.     unify_value_write(Arg1);
  239.   }
  240. }
  241.  
  242. void UnifyValueX() {unify_value(X[P->arg1]);}
  243. void UnifyValueY() {unify_value(E[P->arg1]);}
  244. void UnifyValueWriteX() {unify_value_write(X[P->arg1]);}
  245. void UnifyValueWriteY() {unify_value_write(E[P->arg1]);}
  246. void UnifyUnsafeValue() {unify_value(E[P->arg1]);}
  247. void UnifyUnsafeValueWrite() {unify_value_write(E[P->arg1]);}
  248.  
  249. inline void unify_variable_write(Cell& Var) 
  250. {
  251.   *H = make_ptr(TAGREF, H);
  252.   Var = *H++;
  253. }
  254.  
  255. inline void unify_variable(Cell& Var) 
  256. {
  257.   if (MODE == MODE_READ) 
  258.     Var = *S++;
  259.   else
  260.     unify_variable_write(Var);
  261. }
  262.  
  263. void UnifyVariableX() {unify_variable(X[P->arg1]);}
  264. void UnifyVariableY() {unify_variable(E[P->arg1]);}
  265. void UnifyVariableWriteX() {unify_variable_write(X[P->arg1]);}
  266. void UnifyVariableWriteY() {unify_variable_write(E[P->arg1]);}
  267.  
  268. inline void unify_constant_write(Cell cst) 
  269. {
  270.   *H++ = cst;
  271. }
  272.  
  273. inline void unify_constant(Cell Arg1) 
  274. {
  275.   if (MODE == MODE_READ) 
  276.     get_constant(Arg1, *S++);
  277.   else
  278.     unify_constant_write(Arg1);
  279. }
  280.  
  281. void UnifyConstant() {unify_constant(P->arg1);}
  282. void UnifyConstantWrite() {unify_constant_write(P->arg1);}
  283.  
  284.  /* unify_cdr is no different from unify_variable */
  285.  
  286. void UnifyNil() {unify_constant(NIL);}
  287. void UnifyNilWrite() {unify_constant_write(NIL);}
  288.  
  289. inline void get_cdr_list_write() 
  290. {
  291.   *H = make_ptr(TAGLIST, H + 1); H++;
  292. }       
  293.  
  294. void get_cdr_list() 
  295. {
  296.  if (MODE == MODE_READ) {
  297.       Cell Var = deref(*S++);
  298.       if (get_tag(Var) == TAGLIST) {
  299.     S = addr(Var);
  300.       } else if (get_tag(Var) == TAGREF) {
  301.     MODE = MODE_WRITE;
  302.     Bind(Var, make_ptr(TAGLIST, H));
  303.       } else {
  304.     P = FP0;
  305.       }
  306.     } else {
  307.     get_cdr_list_write();
  308.   }
  309. }
  310. void GetCdrList() {get_cdr_list();}  
  311. void GetCdrListWrite() {get_cdr_list_write();}  
  312.